#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：Employment_class 
@File    ：01_re模块的使用方法.py
@IDE     ：PyCharm 
@Author  ：XiaoDengYa
@Date    ：2021/7/8/008 16:50 
"""
import re

'''
# 匹配以itcast开头的语句  match只能匹配以什么开头

result = re.match("itcast","itcast.com")
print(result.group())


"""
字符    功能
.       匹配任意一个字符（除了\n）
[]      匹配【】中举例的字符
\d      匹配数字，0-9
\D      匹配非数字，即不是数据
\s      匹配空白，即空格，tab键
\S      匹配非空白
\w      匹配单词字符，即a-z，A-Z，0-9
\W      匹配非单词字符 
"""

# . 举例
ret = re.match(".","a")
print(ret.group())

# [] 举例

ret = re.match("[h,H]","Hello Python")
print(ret.group())

ret = re.match("[0-9]","7hello  world")
print(ret.group())

# \d 数字匹配

ret = re.match("嫦娥\d号","嫦娥1号起飞")
print(ret.group())

# \D   匹配非数字，即不是数据

ret = re.match("\D测试一下啦","d测试一下啦")
print(ret.group())

# \s      匹配空白，即空格，tab键
ret = re.match("你好\s呀","你好 呀萨瓦迪卡")
print(ret.group())
# \S      匹配非空白
ret = re.match("你好\S呀","你好_呀萨瓦迪卡")
print(ret.group())
# \w      匹配单词字符，即a-z，A-Z，0-9
ret = re.match("你好\w\d呀","你好78呀萨瓦迪卡")
print(ret.group())
# \W      匹配非单词字符 不能匹配中文字符
ret = re.match("你好\W呀","你好)呀萨瓦迪卡")
print(ret.group())
'''
"""
# 原始字符
mm = "c:\\a\\b\\c"

ret = re.match("c:\\\\", mm)
print(ret.group())

ret = re.match("c:\\\\a", mm).group()
print(ret)

ret = re.match(r"c:\\a", mm).group()
print(ret)

"""

# 表示数量
"""
字符    功能
*       匹配前一个字符出现0次或无限次，既可有可无
+       匹配前一个字符出现一次或者无限次，至少要有一次
?       匹配前一个字符出现1次或者0次，即要么有一次，要么就没有
{m}     匹配前一个字符出现m次
{m,}    匹配前一个字符至少出现m次
{m,n}   匹配前一个字符出现从m到n次 
"""

# 需求：匹配出，⼀个字符串第⼀个字⺟为⼤⼩字符，后⾯都是⼩写字⺟并且 这些⼩写字⺟可有可⽆

# ret = re.match("[A-Z]*[a-z]*", "MNm").group()
# print(ret)
#
# ret = re.match("[A-Z][a-z]*", "Aabcdef").group()
# print(ret)
#
# # 需求：匹配出，变量名是否有效
#
# ret = re.match("[a-zA-Z_]+[\W_]*", "_name1").group()
# print(ret)
#
# # 需求：匹配出，0到99之间的数字
# ret = re.match("[1-9]?[0-9]", "7").group()
# print(ret)
#
# ret = re.match("[1-9]?[0-9]", "33").group()
# print(ret)
#
# ret = re.match("[1-9]?[0-9]", "09").group()
# print(ret)
#
# # 需求：匹配出，8到20位的密码，可以是⼤⼩写英⽂字⺟、数字、下划线
# ret = re.match("[a-zA-Z0-9_]{6}", "12a3g45678").group()
# print(ret)
# ret = re.match("[a-zA-Z0-9_]{8,20}", "1ad12f23s34455ff66").group()
# print(ret)

"""
边界表示
字符      功能
^       匹配字符串开头
$       匹配字符串结尾
\b      匹配一个单词的边界
\B      匹配非单词的边界
"""
# ret = re.match("[\w]{4,20}@163\.com", "xiaoWang@163.com").group()
# print(ret)
#
# ret = re.match("[xiao][\w]*@163\.com", "csyixiaxiaoWang@163.comheihei").group()
# print(ret)
#
# ret = re.match("[\w]{4,20}@163\.com$", "xiaoWang@163.comheihe i").group()
# print(ret)

ret = """
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <input type="button" value="点我点我" onclick="alert('千古壹号的方式1')" />
    </body>
</html>
"""
# res = re.match("value=[\w]{4}\"$",ret).group()
# print("res：",res)

# \b
# res = re.match(r".*\b[ver]+\b", "ho ver abc").group()
# print(res)
#
# res = re.match(r".*\bver[a-z]{3}", "ho verabc").group()
# print(res)
#
# res = re.match(r".*\bver\b", "hover	abc").group()
# print(res)

# \B

res = re.match(r".*\Bver\B", "hoverabc").group()
print(res)

"""
匹配分组
字符      功能
|       匹配左右任意一个表达式
(ab)    将括号中字符作为一个分组
\num    将分组num匹配到的字符串
(?P<name>)  将分组起别名
(?P=name)   引用别名为name分组匹配到的字符串
"""

# | 需求：匹配出0-100之间的数字
# res = re.match("[1-9]?\d","8").group()
# print(res)
#
# res = re.match("[1-9]?\d","78").group()
# print(res)
#
# # 不正确的情况
# # res = re.match("[1-9]?\d","08").group()
# # print(res)
#
# # 修正后
# res = re.match("[1-9]?\d$|100","08").group()
# print(res)

# () 需求：匹配出163、126、qq邮箱之间的数字

# ret = re.match("\w{4,20}@163\.com", "test@163.com").group()
# print(ret)
# ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@126.com").group()
# print(ret)
# ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@qq.com").group()
# print(ret)
# ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@gmail.com").group()
# print(ret)

# \ 需求：匹配出	<html>hh</html>
"""
#	能够完成对正确的字符串的匹配
ret = re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>", "<html>hh</html> ").group()
print(ret)

#	如果遇到⾮正常的html格式字符串，匹配出错
ret = re.match("<[a-zA-Z]*>\w*</[a-z]*\s+[a-zA-Z]*>", "<html>hh</htmlb alabala>").group()
print(ret)

#	通过引⽤分组中匹配到的数据即可，但是要注意是元字符串，即类似	r""这种格 式
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</html>").group()
print(ret)

#	因为2对<>中的数据不⼀致，所以没有匹配出来
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</htmlbalab ala>").group()
print(ret)
"""

# number 需求：匹配出	<html><h1>www.itcast.cn</h1></html>
"""
ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", "<html><h1>www. itcast.cn</h1></html>").group()
print(ret)

ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", "<html><h1>www. itcast.cn</h2></html>").group()
print(ret)
"""

# (?P<name>) (?P=name) 需求：匹配出	<html><h1>www.itcast.cn</h1></html>
ret = re.match(r"<(?P<name3>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name3)>", "<html><h1>www.itcast.cn</h1></html>")
print(ret.group())

ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h2></html>")
print(ret.group())